package cn.com.bluemoon.daps.standard.service;

import cn.com.bluemoon.daps.common.mp.IBmService;
import cn.com.bluemoon.daps.standard.dto.StandardQueryDto;
import cn.com.bluemoon.daps.standard.entity.DapStandardIndex;
import cn.com.bluemoon.daps.standard.excel.pojo.IndexStandardExport;
import cn.com.bluemoon.daps.standard.vo.IndexStandardRelateDwModelVo;
import cn.com.bluemoon.daps.standard.vo.IndexStandardVo;
import org.springframework.lang.Nullable;
import org.springframework.validation.annotation.Validated;
import reactor.util.function.Tuple2;

import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <p>
 * 指标标准表 服务类
 * </p>
 *
 * @author admin
 * @since 2020-08-03
 */
@Validated
public interface DapStandardIndexService extends IBmService<DapStandardIndex> {

    /**
     * 保存指标标准数据
     */
    DapStandardIndex checkAndSaveOrUpdate(@NotNull(message = "保存指标对象不可为空") DapStandardIndex standardIndex);

    /**
     * 进行校验后更新、新增
     */
    void checkInsertOrUpdateModel(DapStandardIndex standardIndex);

    /**
     * 删除指标标准（逻辑、物理删除）
     * 对关联的数据进行处理
     */
    void deleteStandardIndex(@NotNull(message = "指标标准") String standardId, boolean isLogicDel);

    /**
     * 本删除不对流程（多版本进行删除）
     * 不对关联的数据进行处理
     *
     * @param standardId biaozhun
     * @param isLogicDel 逻辑
     */
    void deleteSingleStandardIndex(String standardId, boolean isLogicDel);

    /**
     * 关联报表输出
     */
    List<IndexStandardVo.ReportInfo> relateReportInfo(@NotNull(message = "指标id不可为空") String id);

    /**
     * 获取当前库已发布的标准中英文名称
     *
     * @return t1 中文 t2 英文
     */
    Tuple2<Set<String>, Set<String>> dbPublishStandardNameAndEngName();

    /**
     * 获取除了outOfStandardUniqueId外的已发布的指标标准数据
     *
     * @param outOfStandardUniqueId 已发布标准的唯一id
     */
    Collection<DapStandardIndex> getPublishStandardIndexes(@Nullable String... outOfStandardUniqueId);

    /**
     * 把数据库的实体类转为前后端交互的实体
     * 对实体的id进行翻译
     */
    void transferDicInfo(DapStandardIndex sourceStandardIndex, IndexStandardVo targetStandardIndex);

    /**
     * 获取当前已发布的标准，名称和唯一id的映射
     */
    Map<String, String> dbPublishStandardNameAndStdUniqueIds();

    /**
     * 建立标准与模型表字段关系
     * 1.若标准与模型表字段已存在关系，则删除原来创建新的关系
     * 2.若标准与模型字段无关系，则创建新的关系
     *
     * @param dwModelVo vo
     */
    String relateDwModelTableInfo(IndexStandardRelateDwModelVo dwModelVo);

    /**
     * 导出已发布的指标数据
     * @return
     */
    List<IndexStandardExport> exportData(StandardQueryDto standardQueryDto);


    /**
     * 导出已发布的指标数据
     */
    List<IndexStandardExport> exportData();
}
